package cn.tedu.mall.seckill.service.impl;

import cn.tedu.mall.pojo.product.vo.SkuStandardVO;
import cn.tedu.mall.pojo.seckill.model.SeckillSku;
import cn.tedu.mall.pojo.seckill.vo.SeckillSkuVO;
import cn.tedu.mall.product.service.ISkuService;
import cn.tedu.mall.seckill.mapper.SeckillSkuMapper;
import cn.tedu.mall.seckill.service.ISeckillSkuService;
import cn.tedu.mall.seckill.utils.SeckillCacheUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.math.RandomUtils;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

@Service
@Slf4j
public class SeckillSkuServiceImpl implements ISeckillSkuService {
    @Autowired
    private SeckillSkuMapper skuMapper;
    @DubboReference
    private ISkuService skuService;
    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public List<SeckillSkuVO> listSeckillSkus(Long spuId) {
        List<SeckillSkuVO> seckillSkuVOS = new ArrayList<>();

        List<SeckillSku> seckillSkus = skuMapper.findSeckillSkuBySpuId(spuId);
        for (SeckillSku sku : seckillSkus) {
            Long skuId = sku.getSkuId();
            String seckillSkuVOKey = SeckillCacheUtils.getSeckillSkuVOKey(skuId);
            SeckillSkuVO seckillSkuVO;
            if (redisTemplate.hasKey(seckillSkuVOKey)) {
                log.info("{}号sku商品已经存在缓存",skuId);
                seckillSkuVO = (SeckillSkuVO) redisTemplate.boundValueOps(seckillSkuVOKey).get();
            } else {
                //获取常规信息
                SkuStandardVO standardVO = skuService.getById(sku.getSkuId());
                seckillSkuVO = new SeckillSkuVO();
                BeanUtils.copyProperties(standardVO, seckillSkuVO);
                //赋值秒杀信息
                seckillSkuVO.setSeckillPrice(sku.getSeckillPrice());
                seckillSkuVO.setStock(sku.getSeckillStock());
                seckillSkuVO.setSeckillLimit(sku.getSeckillLimit());

                //将sku存到redis中
                redisTemplate.boundValueOps(seckillSkuVOKey)
                        .set(seckillSkuVO,10*60*1000+ RandomUtils.nextInt(10000), TimeUnit.MILLISECONDS);
                log.info("{}号sku商品已经从数据库获取",skuId);
            }
            //将sku存入集合
            seckillSkuVOS.add(seckillSkuVO);
        }

        return seckillSkuVOS;
    }


}
